package mq.rabbitmq.a_work_queue;

import com.rabbitmq.client.*;
import mq.rabbitmq.ConnectionUtil;
import mq.rabbitmq.MqConstants;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 工作队列模式 消费者
 * 工作模式可以配置多个消费者；
 * 工作模式多个消费者之间是竞争关系
 * 简单队列模式，不需要绑定交换机，实际上工作模式队列会将队列绑定到默认交换机上
 *
 * @author shanzhenbo
 */
public class Recv {

	public static void main(String[] args) throws IOException, InterruptedException,
			TimeoutException {
		//获取连接
		Connection connection = ConnectionUtil.getConnection();
		//创建通道
		Channel channel = connection.createChannel();
		//声明队列
		channel.queueDeclare(MqConstants.QUEUE_NAME, false,
				false, false, null);

		//创建消费者，并设置处理消息
		DefaultConsumer consumer = new DefaultConsumer(channel) {
			/**
			 *
			 * @param consumerTag 消息者标签，在channel.basicConsumer时候可以指定
			 * @param envelope 消息包的内容，可从中获取消息id，消息routingkey，交换机，消息和重传标志
			 * @param properties 属性消息
			 * @param body 消息
			 * @throws IOException
			 */
			@Override
			public void handleDelivery(String consumerTag, Envelope envelope,
			                           AMQP.BasicProperties properties, byte[] body) throws IOException {
				System.out.println("路由key为：" + envelope.getRoutingKey());
				System.out.println("交换机为：" + envelope.getExchange());
				System.out.println("消息ID为：" + envelope.getDeliveryTag());
				System.out.println("接收到的消息为：" + new String(body, "utf-8"));
			}
		};

		/*
		 * 监听消息
		 * 参数2：是否自动确认
		 */
		channel.basicConsume(MqConstants.QUEUE_NAME, true, consumer);
		//无需手动关闭资源
	}

}
